package com.dhcc.common.utils.hql;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.dhcc.framework.exception.DataBaseException;

/**
 * 
* <p>描述: 生成SQL的工具类</p>
* <p>公司: 东华医为</p>
* <p>版权: dhcc2018</p>
* @author  250000576@qq.com
* @date 2015年2月27日 下午5:17:00
* @version V1.0
 */
public class GetSql {
	
	private GetSql() {
	}
	
	public static void getSelectSqlByObject(Object obj,StringBuilder hqlStr,Map<String, Object> map,List<String> list) {
		if(hqlStr.length()==0){
			hqlStr.append("select * from ").append(obj.getClass().getAnnotation(Table.class).name()).append(" where 1=1");
		}
		if (obj==null) {
			return;
		}
		// 获取f对象对应类中的所有属性域
		Field[] fields = obj.getClass().getDeclaredFields();
		for(int i = 0 , len = fields.length; i < len; i++) {
			// 对于每个属性，获取属性名
			String varName = fields[i].getName();
			if ("serialVersionUID".equals(varName)||list.contains(varName)) {
				continue;
			}
			try {
				// 获取原来的访问控制权限
				boolean accessFlag = fields[i].isAccessible();
				// 修改访问控制权限
				fields[i].setAccessible(true);
				// 获取在对象f中属性fields[i]对应的对象中的变量
				Object varValue = fields[i].get(obj);
				if ((varValue!=null)&&(!"".equals(varValue))) {
					// 获取数据库字段名
					Annotation anns = obj.getClass().getDeclaredField(varName).getAnnotation(Column.class);
					String dbName="";
					if (anns==null) {
						Annotation annsTr =obj.getClass().getDeclaredField(varName).getAnnotation(Transient.class);
						if (annsTr!=null) {
							continue;
						}
						dbName=varName;
					}else {
						dbName=((Column) anns).name();
					}
					hqlStr.append(" And ").append(dbName).append("=:varValue").append(i);
					map.put("varValue"+i, varValue);
				}
				// 恢复访问控制权限
				fields[i].setAccessible(accessFlag);
			} catch (Exception e) {
				throw new DataBaseException(e.getMessage(), e);
			}
		}
	}
	public static void getDeleteSqlByObject(Object obj,StringBuilder hqlStr,Map<String, Object> map,List<String> list) {
		if(hqlStr.length()==0){
			hqlStr.append("delete from ").append(obj.getClass().getAnnotation(Table.class).name()).append(" where 1=1");
		}
		if (obj==null) {
			return;
		}
		// 获取f对象对应类中的所有属性域
		Field[] fields = obj.getClass().getDeclaredFields();
		for(int i = 0 , len = fields.length; i < len; i++) {
			// 对于每个属性，获取属性名
			String varName = fields[i].getName();
			if ("serialVersionUID".equals(varName)||list.contains(varName)) {
				continue;
			}
			try {
				// 获取原来的访问控制权限
				boolean accessFlag = fields[i].isAccessible();
				// 修改访问控制权限
				fields[i].setAccessible(true);
				// 获取在对象f中属性fields[i]对应的对象中的变量
				Object varValue = fields[i].get(obj);
				if ((varValue!=null)&&(!"".equals(varValue))) {
					// 获取数据库字段名
					Annotation anns = obj.getClass().getDeclaredField(varName).getAnnotation(Column.class);
					String dbName="";
					if (anns==null) {
						Annotation annsTr =obj.getClass().getDeclaredField(varName).getAnnotation(Transient.class);
						if (annsTr!=null) {
							continue;
						}
						dbName=varName;
					}else {
						dbName=((Column) anns).name();
					}
					hqlStr.append(" And ").append(dbName).append("=:varValue").append(i);
					map.put("varValue"+i, varValue);
				}
				// 恢复访问控制权限
				fields[i].setAccessible(accessFlag);
			} catch (Exception e) {
				throw new DataBaseException(e.getMessage(), e);
			}
		}
	}
}
